import xlrd
import xlwt
from configs.config_manage import EXCEL_PATH
from xlutils.copy import copy


class OperationExcel:
    """操作excel"""

    def __init__(self, file_name=None, sheet_name=None):
        if file_name:
            self.file_path = EXCEL_PATH + file_name
            self.sheet_name = sheet_name
        else:
            self.file_path = "E:\\PyProject\\Hardware_Devices_Interface\\dataconfig\\case1.xls"
            self.sheet_name = 'sheet1'
        self.data = self.get_data()

    def get_data(self):
        """
        获取sheets的内容
        :return:sheet表单整页的数据集合
        """
        # xlrd库的打开工作本方法，打开excle文件，实例化
        data = xlrd.open_workbook(self.file_path)
        # 打开的excle文件根据名称匹配sheet，获取表单数据
        table = data.sheet_by_name(self.sheet_name)
        return table

    def get_max_rows(self):
        """
        获取单元格行数
        :return:
        """
        tables = self.data
        return tables.nrows

    def get_max_cols(self):
        """
        获取单元格列数
        :return:
        """
        tables = self.data
        return tables.ncols

    def get_cell_value(self, row, col):
        """
        获取单元格数据
        :param row: 行
        :param col: 列
        :return:
        """
        tables = self.data
        cell = tables.cell_value(row, col)
        return cell

    def write_value(self, row, col, value):
        """
        回写数据到excel
        :param row:行
        :param col:列
        :param value:值
        :return:
        """
        read_data = xlrd.open_workbook(self.file_path, formatting_info=True)
        new_data = copy(read_data)  # 将xlrd的对象转化为xlwt的对象
        table = new_data.get_sheet(self.sheet_name)
        table.write(row, col, value, self.set_style())
        new_data.save(self.file_path)

    def get_row_data(self, case_id):
        """
        根据对应的case_id获取对应行的内容
        :param case_id: 用例id
        :return:
        """
        row_num = self.get_row_num(case_id)
        row_data = self.get_row_value(row_num)
        return row_data

    def get_row_num(self, case_id):
        """
        根据case_id获取对应行号
        :param case_id:
        :return:
        """
        num = 0
        cols_data = self.get_cols_data()
        for col_data in cols_data:
            if case_id in col_data:
                return num
            num = num + 1

    def get_row_value(self, row):
        """
         根据行号，找到该行的内容
        :param row:行号
        :return:
        """
        tables = self.data
        row_data = tables.row_values(row)
        return row_data

    def get_cols_data(self, col_id=None):
        """
        获取某一列的内容
        :param col_id:列号
        :return:
        """
        if col_id != None:
            cols = self.data.col_values(col_id)
        else:
            cols = self.data.col_values(0)
        return cols

    def set_style(self, name='宋体', height=220, bold=False):
        style = xlwt.XFStyle()  # 初始化样式

        font = xlwt.Font()  # 为样式创建字体
        font.name = name  # 定义具体的字体
        font.bold = bold  # 定义是否加粗
        font.color = 'black'  # 黑色
        # font.color_index = 4  # 定义字体颜色
        font.height = height  # 定义字体大小  220就是11号字体，大概就是11*20得来的吧
        style.font = font  # 最终把自定义的字体，定义到风格里面

        alignment = xlwt.Alignment()  # 设置字体在单元格的位置
        # alignment.horz = xlwt.Alignment.HORZ_CENTER  # 水平方向  HORZ：居中CENTER  左对齐：LEFT  右对齐：RIGHT
        alignment.vert = xlwt.Alignment.VERT_CENTER  # 垂直方向  VERT：居中CENTER  左对齐：LEFT  右对齐：RIGHT
        alignment.horz = xlwt.Alignment.HORZ_LEFT  # 水平左对齐
        style.alignment = alignment

        # border = xlwt.Borders()  # 给单元格加框线
        # border.left = xlwt.Borders.THIN  # 左
        # border.top = xlwt.Borders.THIN  # 上
        # border.right = xlwt.Borders.THIN  # 右
        # border.bottom = xlwt.Borders.THIN  # 下
        # border.left_colour = 0x40  # 设置框线颜色，0x40是黑色，颜色真的巨多，都晕了
        # border.right_colour = 0x40
        # border.top_colour = 0x40
        # border.bottom_colour = 0x40
        # style.borders = border

        return style

if __name__ == '__main__':
    opera = OperationExcel(file_name='自助兑币机.xls', sheet_name='GetPhysicalCoinGoodsList')
    opera.get_data()
    opera.get_cell_value(1, 1)
    opera.write_value(3, 1, 'ceshi样式')
    print(opera.get_max_rows())
    print(opera.get_cell_value(1, 1))
